home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / grafik / converter / limbo4.0 / src / 2d / graphics.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-16  |  5.0 KB  |  189 lines

  1. #include "includes.h"
  2.  
  3.  void Color(BitMap *map,unsigned char col)
  4.   {
  5.    register unsigned int x,y;
  6.    for(x=0;x<map->XSize;x++)
  7.    for(y=0;y<map->YSize;y++) map->Map[x][y]=col;
  8.   }
  9.  
  10.  
  11.  void Color3D(BitMap3D *map,unsigned char col)
  12.   {
  13.    register unsigned int x,y,z;
  14.    for(x=0;x<map->XSize;x++)
  15.    for(y=0;y<map->YSize;y++)
  16.    for(z=0;z<map->ZSize;z++) map->Map[x][y][z]=col;
  17.   }
  18.  
  19.  
  20.  BitMap *Gen3D(BitMap3D *Org,int thres, int step,
  21.                int framecol, int stepframecol,int background)
  22.   {
  23.    BitMap *Dst;
  24.    int depth=Org->ZSize;
  25.    int i,x,y,temp,d=(depth-1)*step;
  26.    
  27.    Dst=GimmeABitMap(Org->XSize+d,Org->YSize+d,Org->ImgType);
  28.    Color(Dst,background);  
  29.  
  30.    for(i=depth;i>0;i--)
  31.     {
  32.      for(x=0;x<Org->XSize;x++)
  33.      for(y=0;y<Org->YSize;y++)
  34.       {
  35.        temp=Org->Map[x][y][i-1];
  36.        if (temp>thres) Dst->Map[x+(i-1)*step][y+(depth-i)*step]=temp;
  37.       }
  38.      if (stepframecol>=0) 
  39.      Rect(Dst,(i-1)*step,(depth-i)*step,Org->XSize,Org->YSize,stepframecol);
  40.     }  
  41.  
  42.    if (framecol>=0)
  43.         {
  44.      Rect(Dst,0,d,Org->XSize,Org->YSize,framecol);
  45.      Line(Dst,0,d,d,0,framecol);
  46.      Line(Dst,d,0,Org->XSize+d-1,0,framecol);
  47.      Line(Dst,Org->XSize+d-1,0,Org->XSize,d-1,framecol);
  48.      Line(Dst,Org->XSize+d-1,0,Org->XSize+d-1,Org->YSize,framecol);
  49.      Line(Dst,Org->XSize-1,Org->YSize+d-1,Org->XSize+d-1,Org->YSize-1,framecol);
  50.     }
  51.    
  52.    return Dst;
  53.   }
  54.  
  55.  
  56.  void Rect(BitMap *map,int x, int y, int dx, int dy, int col)
  57.   {
  58.    register int i;
  59.    for (i=x;i<(x+dx);i++)
  60.     {
  61.      if (col<0) map->Map[i][y]=Invers(map->Map[i][y]);
  62.      else  map->Map[i][y]=col;
  63.      if (col<0) map->Map[i][y+dy-1]=Invers(map->Map[i][y+dy-1]);
  64.      else map->Map[i][y+dy-1]=col;
  65.     }
  66.    
  67.    for (i=y+1;i<(y+dy)-1;i++)
  68.     {
  69.      if (col<0) map->Map[x][i]=Invers(map->Map[x][i]);
  70.      else map->Map[x][i]=col;
  71.      if (col<0) map->Map[x+dx-1][i]=Invers(map->Map[x+dx-1][i]);
  72.      else map->Map[x+dx-1][i]=col;
  73.     }
  74.   }
  75.  
  76.  void Line(BitMap *map, int x1, int y1, int x2, int y2, int col)
  77.   {
  78.    register unsigned int i;
  79.    int temp;
  80.    float alpha;
  81.    
  82.    if (x2-x1!=0) 
  83.     {
  84.      if (x1>x2) 
  85.       {
  86.        temp=x1;
  87.        x1=x2;
  88.        x2=temp;
  89.        temp=y1;
  90.        y1=y2;
  91.        y2=temp;
  92.       }
  93.      alpha=(float)(y2-y1)/(float)(x2-x1);
  94.      
  95.      if ((alpha<=1.0) && (alpha>=-1.0))
  96.       {
  97.        for (i=x1;i<=x2;i++) 
  98.        if (col<0) map->Map[i][(int)(alpha*(i-x1))+y1]=
  99.        Invers(map->Map[i][(int)(alpha*(i-x1))+y1]);
  100.        else map->Map[i][(int)(alpha*(i-x1))+y1]=col;
  101.       }
  102.      else 
  103.       {
  104.        alpha=1.0/alpha;
  105.        if (y1>y2) 
  106.         {
  107.          temp=x1;
  108.          x1=x2;
  109.          x2=temp;
  110.          temp=y1;
  111.          y1=y2;
  112.          y2=temp;
  113.         }
  114.        for (i=y1;i<=y2;i++) 
  115.        if (col<0) map->Map[(int)(alpha*(i-y1))+x1][i]=
  116.        Invers(map->Map[(int)(alpha*(i-y1))+x1][i]);
  117.        else map->Map[(int)(alpha*(i-y1))+x1][i]=col;
  118.       }
  119.     }
  120.    else 
  121.     {
  122.      if (y1>y2) 
  123.       {
  124.        temp=y1;
  125.        y1=y2;
  126.        y2=temp;
  127.       }
  128.      for (i=y1;i<=y2;i++)
  129.      if (col<0) map->Map[x1][i]=Invers(map->Map[x1][i]);
  130.      else map->Map[x1][i]=col;
  131.     }
  132.   }
  133.  
  134.  
  135. /**************************************|****************************************
  136. Routine   : 
  137. Input  par: 
  138. Output par: 
  139. Function  : 
  140. ***************************************|***************************************/
  141.  
  142.  void RectFill(BitMap *map,int x, int y, int dx, int dy, int col)
  143.   {
  144.    register unsigned int i,j;
  145.    for (i=x;i<(x+dx);i++)
  146.     {
  147.      if (col<0) for (j=y;j<(y+dy);j++) map->Map[i][j]=Invers(map->Map[i][j]);
  148.      else for (j=y;j<(y+dy);j++) map->Map[i][j]=col;
  149.     }
  150.   }
  151.  
  152.  
  153.  void RecursiveRect(Transformation *T, BitMap *map,int x, int y, int type, int col)
  154.   {
  155.    int delta=(T->BlockSize);
  156.  
  157.    if (T->Type==type) Rect(map,x,y,delta,delta,col);
  158.    
  159.    if (T->Sub!=NULL) /* do the recursive call */
  160.     {
  161.      if (T->Sub[0][0]!=NULL) RecursiveRect(T->Sub[0][0],map,x           ,y           ,type,col);
  162.      if (T->Sub[1][0]!=NULL) RecursiveRect(T->Sub[1][0],map,x+(delta>>1),y           ,type,col);
  163.      if (T->Sub[0][1]!=NULL) RecursiveRect(T->Sub[0][1],map,x           ,y+(delta>>1),type,col);
  164.      if (T->Sub[1][1]!=NULL) RecursiveRect(T->Sub[1][1],map,x+(delta>>1),y+(delta>>1),type,col);
  165.     }
  166.   }
  167.  
  168. /**************************************|****************************************
  169. Routine   : 
  170. Input  par: 
  171. Output par: 
  172. Function  : 
  173. ***************************************|***************************************/
  174.  
  175.  void RecursiveRectFill(Transformation *T, BitMap *map,int x, int y, int type, int col)
  176.   {
  177.    int delta=T->BlockSize;
  178.  
  179.    if (T->Type==type) RectFill(map,x,y,delta,delta,col);
  180.    
  181.    if (T->Sub!=NULL) /* do the recursive call */
  182.     {
  183.      if (T->Sub[0][0]!=NULL) RecursiveRectFill(T->Sub[0][0],map,x           ,y           ,type,col);
  184.      if (T->Sub[1][0]!=NULL) RecursiveRectFill(T->Sub[1][0],map,x+(delta>>1),y           ,type,col);
  185.      if (T->Sub[0][1]!=NULL) RecursiveRectFill(T->Sub[0][1],map,x           ,y+(delta>>1),type,col);
  186.      if (T->Sub[1][1]!=NULL) RecursiveRectFill(T->Sub[1][1],map,x+(delta>>1),y+(delta>>1),type,col);
  187.     }
  188.   }
  189.